home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / pci_hotplug.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  8.0 KB  |  234 lines

  1. /*
  2.  * PCI HotPlug Core Functions
  3.  *
  4.  * Copyright (C) 1995,2001 Compaq Computer Corporation
  5.  * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)
  6.  * Copyright (C) 2001 IBM Corp.
  7.  *
  8.  * All rights reserved.
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or (at
  13.  * your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful, but
  16.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
  18.  * NON INFRINGEMENT.  See the GNU General Public License for more
  19.  * details.
  20.  *
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with this program; if not, write to the Free Software
  23.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  24.  *
  25.  * Send feedback to <kristen.c.accardi@intel.com>
  26.  *
  27.  */
  28. #ifndef _PCI_HOTPLUG_H
  29. #define _PCI_HOTPLUG_H
  30.  
  31.  
  32. /* These values come from the PCI Hotplug Spec */
  33. enum pci_bus_speed {
  34.     PCI_SPEED_33MHz            = 0x00,
  35.     PCI_SPEED_66MHz            = 0x01,
  36.     PCI_SPEED_66MHz_PCIX        = 0x02,
  37.     PCI_SPEED_100MHz_PCIX        = 0x03,
  38.     PCI_SPEED_133MHz_PCIX        = 0x04,
  39.     PCI_SPEED_66MHz_PCIX_ECC    = 0x05,
  40.     PCI_SPEED_100MHz_PCIX_ECC    = 0x06,
  41.     PCI_SPEED_133MHz_PCIX_ECC    = 0x07,
  42.     PCI_SPEED_66MHz_PCIX_266    = 0x09,
  43.     PCI_SPEED_100MHz_PCIX_266    = 0x0a,
  44.     PCI_SPEED_133MHz_PCIX_266    = 0x0b,
  45.     PCI_SPEED_66MHz_PCIX_533    = 0x11,
  46.     PCI_SPEED_100MHz_PCIX_533    = 0x12,
  47.     PCI_SPEED_133MHz_PCIX_533    = 0x13,
  48.     PCI_SPEED_UNKNOWN        = 0xff,
  49. };
  50.  
  51. /* These values come from the PCI Express Spec */
  52. enum pcie_link_width {
  53.     PCIE_LNK_WIDTH_RESRV    = 0x00,
  54.     PCIE_LNK_X1        = 0x01,
  55.     PCIE_LNK_X2        = 0x02,
  56.     PCIE_LNK_X4        = 0x04,
  57.     PCIE_LNK_X8        = 0x08,
  58.     PCIE_LNK_X12        = 0x0C,
  59.     PCIE_LNK_X16        = 0x10,
  60.     PCIE_LNK_X32        = 0x20,
  61.     PCIE_LNK_WIDTH_UNKNOWN  = 0xFF,
  62. };
  63.  
  64. enum pcie_link_speed {
  65.     PCIE_2PT5GB        = 0x14,
  66.     PCIE_LNK_SPEED_UNKNOWN    = 0xFF,
  67. };
  68.  
  69. struct hotplug_slot;
  70. struct hotplug_slot_attribute {
  71.     struct attribute attr;
  72.     ssize_t (*show)(struct hotplug_slot *, char *);
  73.     ssize_t (*store)(struct hotplug_slot *, const char *, size_t);
  74. };
  75. #define to_hotplug_attr(n) container_of(n, struct hotplug_slot_attribute, attr);
  76.  
  77. /**
  78.  * struct hotplug_slot_ops -the callbacks that the hotplug pci core can use
  79.  * @owner: The module owner of this structure
  80.  * @enable_slot: Called when the user wants to enable a specific pci slot
  81.  * @disable_slot: Called when the user wants to disable a specific pci slot
  82.  * @set_attention_status: Called to set the specific slot's attention LED to
  83.  * the specified value
  84.  * @hardware_test: Called to run a specified hardware test on the specified
  85.  * slot.
  86.  * @get_power_status: Called to get the current power status of a slot.
  87.  *     If this field is NULL, the value passed in the struct hotplug_slot_info
  88.  *     will be used when this value is requested by a user.
  89.  * @get_attention_status: Called to get the current attention status of a slot.
  90.  *    If this field is NULL, the value passed in the struct hotplug_slot_info
  91.  *    will be used when this value is requested by a user.
  92.  * @get_latch_status: Called to get the current latch status of a slot.
  93.  *    If this field is NULL, the value passed in the struct hotplug_slot_info
  94.  *    will be used when this value is requested by a user.
  95.  * @get_adapter_status: Called to get see if an adapter is present in the slot or not.
  96.  *    If this field is NULL, the value passed in the struct hotplug_slot_info
  97.  *    will be used when this value is requested by a user.
  98.  * @get_max_bus_speed: Called to get the max bus speed for a slot.
  99.  *    If this field is NULL, the value passed in the struct hotplug_slot_info
  100.  *    will be used when this value is requested by a user.
  101.  * @get_cur_bus_speed: Called to get the current bus speed for a slot.
  102.  *    If this field is NULL, the value passed in the struct hotplug_slot_info
  103.  *    will be used when this value is requested by a user.
  104.  *
  105.  * The table of function pointers that is passed to the hotplug pci core by a
  106.  * hotplug pci driver.  These functions are called by the hotplug pci core when
  107.  * the user wants to do something to a specific slot (query it for information,
  108.  * set an LED, enable / disable power, etc.)
  109.  */
  110. struct hotplug_slot_ops {
  111.     struct module *owner;
  112.     int (*enable_slot)        (struct hotplug_slot *slot);
  113.     int (*disable_slot)        (struct hotplug_slot *slot);
  114.     int (*set_attention_status)    (struct hotplug_slot *slot, u8 value);
  115.     int (*hardware_test)        (struct hotplug_slot *slot, u32 value);
  116.     int (*get_power_status)        (struct hotplug_slot *slot, u8 *value);
  117.     int (*get_attention_status)    (struct hotplug_slot *slot, u8 *value);
  118.     int (*get_latch_status)        (struct hotplug_slot *slot, u8 *value);
  119.     int (*get_adapter_status)    (struct hotplug_slot *slot, u8 *value);
  120.     int (*get_max_bus_speed)    (struct hotplug_slot *slot, enum pci_bus_speed *value);
  121.     int (*get_cur_bus_speed)    (struct hotplug_slot *slot, enum pci_bus_speed *value);
  122. };
  123.  
  124. /**
  125.  * struct hotplug_slot_info - used to notify the hotplug pci core of the state of the slot
  126.  * @power: if power is enabled or not (1/0)
  127.  * @attention_status: if the attention light is enabled or not (1/0)
  128.  * @latch_status: if the latch (if any) is open or closed (1/0)
  129.  * @adapter_present: if there is a pci board present in the slot or not (1/0)
  130.  * @address: (domain << 16 | bus << 8 | dev)
  131.  *
  132.  * Used to notify the hotplug pci core of the status of a specific slot.
  133.  */
  134. struct hotplug_slot_info {
  135.     u8    power_status;
  136.     u8    attention_status;
  137.     u8    latch_status;
  138.     u8    adapter_status;
  139.     enum pci_bus_speed    max_bus_speed;
  140.     enum pci_bus_speed    cur_bus_speed;
  141. };
  142.  
  143. /**
  144.  * struct hotplug_slot - used to register a physical slot with the hotplug pci core
  145.  * @ops: pointer to the &struct hotplug_slot_ops to be used for this slot
  146.  * @info: pointer to the &struct hotplug_slot_info for the initial values for
  147.  * this slot.
  148.  * @release: called during pci_hp_deregister to free memory allocated in a
  149.  * hotplug_slot structure.
  150.  * @private: used by the hotplug pci controller driver to store whatever it
  151.  * needs.
  152.  */
  153. struct hotplug_slot {
  154.     struct hotplug_slot_ops        *ops;
  155.     struct hotplug_slot_info    *info;
  156.     void (*release) (struct hotplug_slot *slot);
  157.     void                *private;
  158.  
  159.     /* Variables below this are for use only by the hotplug pci core. */
  160.     struct list_head        slot_list;
  161.     struct pci_slot            *pci_slot;
  162. };
  163. #define to_hotplug_slot(n) container_of(n, struct hotplug_slot, kobj)
  164.  
  165. static inline const char *hotplug_slot_name(const struct hotplug_slot *slot)
  166. {
  167.     return pci_slot_name(slot->pci_slot);
  168. }
  169.  
  170. extern int pci_hp_register(struct hotplug_slot *, struct pci_bus *, int nr,
  171.                const char *name);
  172. extern int pci_hp_deregister(struct hotplug_slot *slot);
  173. extern int __must_check pci_hp_change_slot_info    (struct hotplug_slot *slot,
  174.                          struct hotplug_slot_info *info);
  175.  
  176. /* PCI Setting Record (Type 0) */
  177. struct hpp_type0 {
  178.     u32 revision;
  179.     u8  cache_line_size;
  180.     u8  latency_timer;
  181.     u8  enable_serr;
  182.     u8  enable_perr;
  183. };
  184.  
  185. /* PCI-X Setting Record (Type 1) */
  186. struct hpp_type1 {
  187.     u32 revision;
  188.     u8  max_mem_read;
  189.     u8  avg_max_split;
  190.     u16 tot_max_split;
  191. };
  192.  
  193. /* PCI Express Setting Record (Type 2) */
  194. struct hpp_type2 {
  195.     u32 revision;
  196.     u32 unc_err_mask_and;
  197.     u32 unc_err_mask_or;
  198.     u32 unc_err_sever_and;
  199.     u32 unc_err_sever_or;
  200.     u32 cor_err_mask_and;
  201.     u32 cor_err_mask_or;
  202.     u32 adv_err_cap_and;
  203.     u32 adv_err_cap_or;
  204.     u16 pci_exp_devctl_and;
  205.     u16 pci_exp_devctl_or;
  206.     u16 pci_exp_lnkctl_and;
  207.     u16 pci_exp_lnkctl_or;
  208.     u32 sec_unc_err_sever_and;
  209.     u32 sec_unc_err_sever_or;
  210.     u32 sec_unc_err_mask_and;
  211.     u32 sec_unc_err_mask_or;
  212. };
  213.  
  214. struct hotplug_params {
  215.     struct hpp_type0 *t0;        /* Type0: NULL if not available */
  216.     struct hpp_type1 *t1;        /* Type1: NULL if not available */
  217.     struct hpp_type2 *t2;        /* Type2: NULL if not available */
  218.     struct hpp_type0 type0_data;
  219.     struct hpp_type1 type1_data;
  220.     struct hpp_type2 type2_data;
  221. };
  222.  
  223. #ifdef CONFIG_ACPI
  224. #include <acpi/acpi.h>
  225. #include <acpi/acpi_bus.h>
  226. #include <acpi/actypes.h>
  227. extern acpi_status acpi_get_hp_params_from_firmware(struct pci_bus *bus,
  228.                 struct hotplug_params *hpp);
  229. int acpi_get_hp_hw_control_from_firmware(struct pci_dev *dev, u32 flags);
  230. int acpi_root_bridge(acpi_handle handle);
  231. #endif
  232. #endif
  233.  
  234.